package com.iflytek.sbd.demo.jihe.collection.list;

import java.util.LinkedList;

/**
 * @program: sbd
 * @description:
 * @author: 陈英俊
 * @create: 2022-01-12 14:30
 */
public class LinkedListDemo {

    public static void main(String[] args) {


        /**
         * <p>
         *     构造方法:　无参构造，集合构造方法
         * </p>
         * <p>
         *      无参构造LinkedList初始化集合的时候,并没有在底层初始化链表,而是在第一次add的时候,构建底层的双向链表,支持存入多个null
         * </p>
         */
//        LinkedList<Integer> linkedList = new LinkedList<>();
//        linkedList.add(null);
//        linkedList.add(null);
//        linkedList.add(null);
//        linkedList.add(null);
//        System.out.println(linkedList.size());//4 支持存多个null

        /**
         * 调试LinkedList的底层链表的删除
         * 第一种:
         * 链表.remove(index),基于索引进行删除
         * 底层实现的是根据索引进行删除,第一步是判断索引是否存在,第二步是通过位运算找到链表.size的中间值,比如链表长度1000.
         * 中间值就是500. 需要删除的索引大于中间值,从链表的尾部开始循环遍历,找到需要需要删除节点,需要删除的索引小于中间值,
         * 从链表的头部开始循环遍历,找到需要删除的节点, 这样的机制的结果就是链表长度32w, 我需要删除索引是16.1w的数据,我需
         * 要遍历估计15.9w次,效率低下
         * 第二种:
         * 链表．remove(Object o),基于数据进行删除
         * 底层是也是循环遍历链表的每个节点,然后每个节点的item(存储的数据).equals(需要删除的数据),这样的效率更低
         *
         */


//        LinkedList<String> linkedList3 = new LinkedList<>();
//        for (int i = 1; i <= 998; i++) {
//            linkedList3.add(i + "wo");
//        }
//       // linkedList3.remove(501);
//        linkedList3.remove("400wo");


        LinkedList<Integer> linkedList4 = new LinkedList<>();
        linkedList4.add(1);
        linkedList4.add(2);
        linkedList4.add(3);
        System.out.println(linkedList4.getFirst()+"/"+linkedList4.getLast());
    }
}